package com.second.app.thread.线程基础.day03.twoobjecttwolock;

/**
 * @Author GYZ
 * @Date 2023/11/21
 * <pre>
 *     下面示例：
 *         2个线程分别访问同一个类的两个不同实例的相同名称的同步方法，效果却是以异步的方式运行的
 *         本示例由于创建2个业务对象，在系统中产生2个锁。所以运行结果是异步的，打印出来的效果
 *         就是先打印b，在打印a。
 *      因为关键字synchronized,是取的对象锁，而不是把一段代码或方法（函数）当作锁，所以哪个线程先
 *      执行关键字synchronized的方法，哪个线程就持有该方法所属对象的lock，其他线程只能呈等待状态，前提是多个多个线程
 *      访问的是同一个对象。
 *        但是如果多个线程访问多个对象，则JVM会创建多个锁。
 * </pre>
 */
public class Main {
    public static void main(String[] args) {
        class Thread001 extends Thread {
            private HasSelfPrivateNum hasSelfPrivateNum;

            public Thread001(HasSelfPrivateNum hasSelfPrivateNum) {
                this.hasSelfPrivateNum = hasSelfPrivateNum;
            }

            @Override
            public void run() {
                hasSelfPrivateNum.addI("a");
            }
        }

        class Thread002 extends Thread {
            private HasSelfPrivateNum hasSelfPrivateNum;

            public Thread002(HasSelfPrivateNum hasSelfPrivateNum) {
                this.hasSelfPrivateNum = hasSelfPrivateNum;
            }

            @Override
            public void run() {
                hasSelfPrivateNum.addI("b");
            }
        }

        HasSelfPrivateNum hasSelf1PrivateNum = new HasSelfPrivateNum();

        HasSelfPrivateNum hasSelf2PrivateNum = new HasSelfPrivateNum();

        Thread001 thread001 = new Thread001(hasSelf1PrivateNum);

        thread001.start();

        Thread002 thread002 = new Thread002(hasSelf2PrivateNum);

        thread002.start();
    }
}
